chapter 9
当有不命中发生时,才换入页面的这种策略称为按需页面调度(demand paging)ÿ 也可以采用其他的方法,例如尝试着预测不命中,在页面实际被引用之前就换人页面。然而,所有现代系统都使用的是按需页面调度的方式。
这些功能是由软硬件联合提供的,包括操作系统软件、MMU(内存管理单元)中的地址翻译硬件和一个存放在物理内存中叫做页表(page table)的数据结构,页表将虚拟页映射到物理页。
地址翻译硬件在 MMU 中,页表在物理内存中。
图 9-12 展示了 MMU 如何利用页表来实现这种映射。
突然感觉自己漏了很多东西没看懂,什么是页偏移量?从大小上来看是页面的字节大小,但是为什么叫偏移量?
9.8 内存映射
一知半解……
一个实际的分配器要在吞吐率和利用率之间把握好平衡,就必须考虑以下几个问题: •空闲块组织:我们如何记录空闲块? * 放置:我们如何选择一个合适的空闲块来放置一个新分配的块? •分割:在将一个新分配的块放置到某个空闲块之后,我们如何处理这个空闲块中的剩余部分? * 合并:我们如何处理一个刚刚被释放的块?
需要考虑的问题。
分配器执行这种搜索的方式是由放置策略(placement policy)确定的。一些常见的策略是首次适配(first Ht)、下一次适配(next Ht)和最佳适配(best fit)。
分配器可以选择立即合并(immediate coalescing), 也就是在每次一个块被释放时,就合并所有的相邻块。或者它也可以选择推迟合并(deferred coalescing), 也就是等到某个稍晚的时候再合并空闲块。例如 ,分配器可以推迟合并,直到某个分配请求失败,然后扫描整个堆,合并所有的空闲块。
在对分配器的讨论中,我们会假设使用立即合并,但是你应该了解,快速的分配器通常会选择某种形式的推迟合并。
综合:实现一个简单的分配器
我们的讨论局限于 McCarthy 独创的 Mark&Sweep(标记&•清除)算法,这个算法很有趣, 因为它可以建立在已存在的 malloc 包的基础之上 ,为 C 和 C++ 程序提供垃圾收集。
无论何时需要堆空间时,应用都会用通常的方式调用 mallocÿ 如果 malloc 找不到一个合适的空闲块 ,那么它就调用垃圾收集器 ,希望能够回收一些垃圾到空闲链表。
现代系统通过将虚拟内存片和磁盘上的文件片关联起来 ,来初始化虚拟内存片,这个过程称为内存映射。内存映射为共享数据、创建新的进程以及加载程序提供了一种高效的机制。